package com.woniuxy.interceptor;

import com.woniuxy.annotations.RequirePerm;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
 * @Author: 邓宇昂
 * @Description: 认证权限注解的拦截器: 识别方法的注解，判断当前登录用户有没有这个权限或者角色
 * @DateTime: 22/12/09/0009 15:38
 * @Component: 成都蜗牛学苑
 **/
public class AuthPermInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //handler判断是部署一个方法：排除静态资源访问
        if (handler instanceof HandlerMethod){
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            //判断该方法是否存在这个注解，如果有这个注解表示需要进行权限判断
            if (method.isAnnotationPresent(RequirePerm.class)) {
                RequirePerm annotation = method.getAnnotation(RequirePerm.class);
                //就已经获取到了对应执行的controller方法上的注解标注的参数值"order::add","order::edit"
                String[] perms = annotation.perms();
                for (String perm : perms) {
                    //获取请求头的token，然后，去数据库查询对应用户的权限，根据权限列表遍历比较，如果满足，则放行
                    if (perm.equals(request.getHeader("perm"))){
                        return true;
                    }
                }
            }else{
                //如果不需要判断权限，也应该放行
                return true;
            }
        }else{
            return true;
        }
        //所有权限比较都失败的时候，才会进入这里。
        response.setStatus(400);
        return false;
    }
}
